import express from 'express'
// import mysql2 from 'mysql2/promise'

import knex from 'knex'

import fs from 'node:fs'
import jsyaml from 'js-yaml'

const yaml = fs.readFileSync('./db.config.yaml', 'utf-8')
const dbconfig = jsyaml.load(yaml)

const db = knex({
    client: 'mysql2',  // knex支持多种数据库，这里要告诉knex使用的哪种
    connection: dbconfig.db
})

// knex可以定义并创建表， knex所有代码直接编写是没有效果的
db.schema.createTableIfNotExists('t_node_user', table => {  // 定义表结构
    table.increments('id')   // id主键， 设置自增
    table.integer('age')  // 设置类型为整数型
    table.string('name')  // 设置类型为字符串
    table.timestamps(true, true)  // 自动生成创建时间和更新时间
}).then(() => {                  // knex所有代码直接编写是没有效果的 ， 必须.then接收一下，才有效果，才会执行
    console.log('创建成功');
})

// 事务操作
db.transaction(async trx => {
    try {
        // ...
        await trx.commit()    // 提交事务
    } catch (error) {
        trx.rollback()   // 回滚事务
    }
})

const app = express()

app.use(express.json())  // 使用中间件支持post的解析

// 改造sql语句
// 查询所有
app.get('/user/list', async (req, res) => {
    // const [data] = await sql.query('select * from user')   
    const data = await db('t_node_user').select()
    const count = await db('t_node_user').count('* as total')  // 给出总个数， 结构是 [{total: 0}]

    console.log(db('t_node_user').select().toSQL().sql);   // 反编译  生成sql语句， 可以调试
    // 也可以自己写sql语句, 防止它的api满足不了，自己可以写复杂的sql
    // db.raw("select * from user").then(data => {
    //     console.log(data);
    // })
    // 连表操作
    db('t_student').select().leftJoin('t_class', 'c_no', 'classno')  // 里面的参数是，要连接的表及两个表相关联的字段

    res.send({data, count: count[0].total})
})

// 查询单个
app.get('/user/single/:id', async (req, res) => {
    // const [row] = await sql.query(`select * from user where id = ?`, [req.params.id])  
    const row = await db('t_node_user').select().where({id: req.params.id})
    res.send(row)
})

// 增 creat
app.post('/user/add', async (req, res) => {
    const { name, age } = req.body
    // await sql.query(`insert into user(name, age) values(?, ?)`, [name, age])
    await db('t_node_user').insert({name, age})

    res.send({code: 200})
})

// 改
app.post('/user/update', async (req, res) => {
    const { name, age, id } = req.body
    // await sql.query(`update user set name=?, age=? where id=?`, [name, age, id])
    await db('t_node_user').update({name, age}).where({id})

    res.send({code: 200})
})

// 删
app.post('/user/delete', async (req, res) => {
    const { id } = req.body
    // await sql.query(`delete from user where id=?`, [id])
    await db('t_node_user').delete().where({id})

    res.send({code: 200})
})

app.listen(9000, () => {
    console.log(9000 + '启动成功');
})